package com.poem.springboot_rear.service;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.poem.springboot_rear.entity.User;
import com.poem.springboot_rear.exception.ServiceException;
import com.poem.springboot_rear.mapper.UserMapper;
import com.poem.springboot_rear.utils.TokenUtils;
import com.poem.springboot_rear.vo.MenuVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class UserService extends ServiceImpl<UserMapper,User> {


    @Resource
    UserMapper userMapper;
    // 重写save方法

    public List<MenuVo> loadTree(){
        // 查找所有的数据
        List<User> all = this.list();
        // 创建一个MenuVo的集合
        List<MenuVo> listRet = new ArrayList();
        // 查到根节点，也就是为0的
        for (User user : all){
            if (user.getParentId() == 0) {
                MenuVo menuVo = new MenuVo();
                menuVo.setId(user.getId());
                menuVo.setUsername(user.getUsername());
                menuVo.setParentId(user.getParentId());
                listRet.add(menuVo);
                // 处理子菜单
                dealChildren(menuVo,all);
            }
        }
        return listRet;
    };
    public void dealChildren(MenuVo menuVoParent,List<User> all ){
        for (User user : all) {
            // 找到menuVo 子菜单
            if (user.getParentId() == menuVoParent.getId()){
                MenuVo menuVo = new MenuVo();
                menuVo.setId(user.getId());
                menuVo.setUsername(user.getUsername());
                menuVo.setParentId(user.getParentId());
                menuVoParent.getChildren().add(menuVo);
                // 处理子菜单
                dealChildren(menuVo,all);
            }
        }
    }

    @Override
    public boolean save(User entity) {
        // 如果name为空，那么就把username的内容赋值给它
        if (StrUtil.isBlank(entity.getName())){
            entity.setName(entity.getUsername());
        }
        // 如果密码为空，设置一个初始值密码
        if (StrUtil.isBlank(entity.getPassword())){
            entity.setPassword("123");
        }
        // 如果角色为空，设置一个初始值角色
        if (StrUtil.isBlank(entity.getRole())){
            entity.setRole("用户");
        }
        return super.save(entity);
    }

    // 封装一个方法用来复用
    public User selectByUsername(String username){
        // queryWrapper 条件查询器
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 例如： eq => ==   where username = #{username}
        queryWrapper.eq("username",username);
        // 根据用户名查询数据库的用户信息
        return getOne(queryWrapper);
    }

    // 验证账号是否存在或正确
    public User login(User user) {
//        // queryWrapper 条件查询器
//        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        // 例如： eq => ==   where username = #{username}
//        queryWrapper.eq("username",user.getUsername());
//        // 根据用户名查询数据库的用户信息
//       User dbUser = userMapper.selectOne(queryWrapper); // select * from user where username = #{username}
        User dbUser = selectByUsername(user.getUsername()); // 调用上面的方法
        // 判断数据查到的是否为空，为空则说明账号不存在
       if (dbUser == null){
           // 抛出一个自定义的异常
            throw new ServiceException("用户名或密码错误");
       }
       // 判断前端的密码跟数据库的密码是否一致
       if (!user.getPassword().equals(dbUser.getPassword())){
           throw new ServiceException("用户名或密码错误");
       }
       // 生成token 传两个参数 id和password  密码用来加密验签
        // 这里使用从数据库查到的数据
        String token = TokenUtils.createToken(dbUser.getId().toString(), dbUser.getPassword());
        dbUser.setToken(token); // 传递token到前端
        // 返回数据库查到的dbUser
        return dbUser;
    }

    public User register(User user){
        // 根据用户名查询数据库的用户信息
//        User dbUser = userMapper.selectByUsername(user.getUsername());
        User dbUser = selectByUsername(user.getUsername()); // 调用上面的方法
        // 判断数据查到的是否为空，不为空则说明账号存在
        if (dbUser != null){
            // 抛出一个自定义的异常
            throw new ServiceException("用户已存在");
        }
            // 限制注册账号跟密码的长度
        if (user.getUsername().length() > 10 || user.getPassword().length() > 20){
            // 抛出一个自定义的异常
            throw new ServiceException("输入输入不合法");
        }
        user.setName(user.getUsername());
        userMapper.insert(user);
        return user;
    }

    public void resetPassword(User user) {
        // 根据用户名查询数据库的用户信息
//        User dbUser = userMapper.selectByUsername(user.getUsername());
        User dbUser = selectByUsername(user.getUsername()); // 调用上面的方法
        // 判断数据查到的是否为空，不为空则说明账号存在
        if (dbUser == null){
            // 抛出一个自定义的异常
            throw new ServiceException("用户不存在");
        }
        // 判断前端的手机号码跟数据库的手机号码是否一致
        if (!user.getPhone().equals(dbUser.getPhone())){
            throw new ServiceException("验证错误");
        }
        dbUser.setPassword("123"); // 重置密码
        userMapper.updateById(dbUser);
    }

}
